﻿using System;

namespace Activity.I
{
	/// <summary>
	/// Персональный компьютер.
	/// </summary>
	public class PC
	{
		// Заводские установки
		public const string DefaultName = "DEFAULT-PC";
		public const string DefaultOS= "MS-DOS";
		public const string DefaultUser = "admin";
		public const string DefaultPassword = "admin";

		private static PC[] _machines = new PC[0];
		private string _password;

		/// <summary>
		/// Массив зарегистрированных компьютеров.
		/// </summary>
		public static PC[] Machines { get { return _machines; } }

		/// <summary>
		/// Создать новый экземпляр персонального компьютера.
		/// </summary>
		/// <param name="name">Имя компьютера.</param>
		/// <param name="os">Название операционной системы.</param>
		public PC (string name, string os)
		{
			// Установить заводские установки
			Reset();

			// Установить начальные данные
			Name = name;
			OS = os;

			// Зарегистрировать новый компьютер
			Array.Resize(ref _machines, Machines.Length + 1);
			_machines[_machines.Length - 1] = this;
		}

		/// <summary>
		/// Название персонального компьютера.
		/// </summary>
		public string Name { get; private set; }

		/// <summary>
		/// Имя пользователя.
		/// </summary>
		public string User { get; private set; }

		/// <summary>
		/// Название операционной системы.
		/// </summary>
		public string OS { get; private set; }

		/// <summary>
		/// Является ли компьютер заблокированным в данный момент.
		/// </summary>
		public bool IsLocked { get; private set; }

		/// <summary>
		/// Заблокировать доступ к компьютеру.
		/// </summary>
		public void Lock ()
		{
			IsLocked = true;
		}

		/// <summary>
		/// Сброс настроек компьютера к заводским установкам.
		/// </summary>
		public void Reset ()
		{
			// Заводские установки
			OS = DefaultOS;
			Name = DefaultName;
			User = DefaultUser;
			_password = DefaultPassword;

			// Заблокировать доступ
			Lock();
		}

		/// <summary>
		/// Разблокировать доступ к компьютеру.
		/// </summary>
		/// <param name="password">Пароль доступа.</param>
		/// <returns>Возвращает истину если компьютер был разблокирован; иначе ложь.</returns>
		public bool Unlock (string password)
		{
			// Компьютер не заблокирован
			if (!IsLocked) return true;

			// Разблокировать если пароль совпадает
			if (string.Equals(_password, password))
				IsLocked = false;

			return IsLocked;
		}

		/// <summary>
		/// Изменить имя компьютера.
		/// </summary>
		/// <param name="name">Новое имя компьютера.</param>
		public void ChangeName (string name)
		{
			if (!IsLocked) Name = name;
		}

		/// <summary>
		/// Изменить имя пользователя.
		/// </summary>
		/// <param name="user">Новое имя пользователя.</param>
		public void ChangeUser (string user)
		{
			if (!IsLocked) User = user;
		}

		/// <summary>
		/// Изменить пароль доступа к компьютеру.
		/// </summary>
		/// <param name="password">Новый пароль.</param>
		public void ChangePassword (string password)
		{
			if (!IsLocked) _password = password;
		}

		/// <summary>
		/// Установить операционную систему.
		/// </summary>
		/// <param name="os">Новая операционная система.</param>
		public void InstallOS (string os)
		{
			if (!IsLocked) OS = os;
		}
	}
}
